#include <boost/dynamic_bitset.hpp>

#include <kuai/misc/typedef.hpp>


#ifndef _KUAI_FILTER_HPP_
#define _KUAI_FILTER_HPP_

namespace kuai {
	
	class LowerTriangleFilter0 {
	public:
		explicit LowerTriangleFilter0(size_t n, bool init = false) 
			: bits(n*(n-1)/2)
		{ 
			if (init) {
				bits.set();
			}
			else {
				bits.reset();
			}
		}

		bool test(size_t i, size_t j) const {
			return bits.test(offset(i, j));
		}

		void set(size_t i, size_t j, bool value=true) {
			bits.set(offset(i, j), value);
		}

		void reset(size_t i, size_t j) {
			set(i, j, false);		
		}

		void flip(size_t i, size_t j) {
			bits.flip(offset(i, j));
		}

		void set(bool value=true) {
			if (value) {
				bits.set();
			}
			else {
				bits.reset();
			}
		}

		void reset() {
			set(false);		
		}

		void flip() {
			bits.flip();
		} 

		static inline size_t offset(size_t i, size_t j) {
			assert (i != j);
			if (i < j) {
				std::swap(i, j);
			}
			return i*(i-1)/2 + j;
		}

	private:
		
		boost::dynamic_bitset<Byte> bits;
	};
}

#endif
